Skip to content

[true-async] Enable HTTP/3 for true-async-server (v0.7.0 + baseline-h3/static-h3)#771

Closed
EdmondDantes wants to merge 4 commits into
MDA2AV:mainfrom
EdmondDantes:h3-arena-enable
Closed

[true-async] Enable HTTP/3 for true-async-server (v0.7.0 + baseline-h3/static-h3)#771
EdmondDantes wants to merge 4 commits into
MDA2AV:mainfrom
EdmondDantes:h3-arena-enable

Conversation

@EdmondDantes
Copy link
Copy Markdown
Contributor

@EdmondDantes EdmondDantes commented Jun 1, 2026

What

Turn HTTP/3 on for true-async-server and benchmark it.

  • Base image → trueasync/php-true-async:0.7.0-rc.3-php8.6 (was beta.5) —
    first published image carrying server v0.7.0, which ships the full HTTP/3 /
    QUIC server (ngtcp2 1.22.1 + nghttp3 1.15.0).
  • Restore the H3 listener in entry.php (addHttp3Listener on UDP :8443,
    default-on, H3_DISABLE=1 to opt out). It was dropped in [true-async] drop HTTP/3 listener #744.
  • Subscribe baseline-h3 + static-h3 in meta.json.
  • Pin the TLS clear-text-out BIO ring to 64 KiB (setTlsBufferBytes, Add Gin: Go web framework with httprouter (~80k⭐) #29) —
    matches the built-in default, set explicitly so the arena's TLS write buffer
    stays fixed.
  • Document the QUIC UDP port (8443/udp) in EXPOSE.

The server gained a working HTTP/3 listener (35 phpt green, incl. E2E GET/
POST/streaming/static over QUIC). entry.php already binds the H3 UDP listener
on :8443 by default; it just wasn't being benchmarked because meta.json
subscribed to no h3 profile.

Subscribe baseline-h3 + static-h3 so the arena actually exercises HTTP/3.
A 120-iteration back-to-back restart repro (16 and 64 workers) showed 0
startup failures with the H3 listener on, so no per-profile gating is needed —
h2 (TCP :8443) and h3 (QUIC UDP :8443) coexist as designed.
Pin to trueasync/php-true-async:0.7.0-rc.3-php8.6 — the first published image
carrying server v0.7.0, which ships the HTTP/3 / QUIC listener (ngtcp2 1.22.1 +
nghttp3 1.15.0). Pairs with subscribing baseline-h3 + static-h3 so the arena
actually exercises HTTP/3. Also document the QUIC UDP port (8443/udp) in EXPOSE.
# Conflicts:
#	frameworks/true-async-server/Dockerfile
@EdmondDantes
Copy link
Copy Markdown
Contributor Author

EdmondDantes commented Jun 1, 2026

/benchmark -f true-async-server

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

👋 /benchmark request received. A collaborator will review and approve the run.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

Benchmark Results

Framework: true-async-server | Test: all tests

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 1,458,274 6266.6% 184MiB -32.3% +1.1%
baseline 4096 1,553,382 6195.6% 207MiB -31.3% -5.9%
pipelined 512 2,266,164 6249.9% 146MiB -74.8% -2.7%
pipelined 4096 1,381,928 6471.3% 220MiB -39.8% -10.2%
limited-conn 512 1,240,698 6063.7% 157MiB -22.9% ~0%
limited-conn 4096 1,279,875 6391.0% 194MiB -28.9% +17.6%
json 4096 852,995 6506.0% 264MiB -13.3% ~0%
json-comp 512 412,281 5772.2% 176MiB -7.4% +0.6%
json-comp 4096 433,198 6202.1% 254MiB -5.4% ~0%
json-comp 16384 419,290 6258.1% 513MiB -4.8% +5.3%
json-tls 4096 729,530 6552.2% 625MiB -6.8% -0.3%
upload 32 2,546 1901.8% 313MiB -1.4% +3.6%
upload 256 3,072 3535.0% 551MiB +1.7% +6.0%
api-4 256 51,257 394.7% 43MiB -9.0% +2.4%
api-16 1024 143,872 1564.8% 79MiB -5.8% +2.6%
static 1024 483,238 2711.4% 179MiB -20.8% +2.3%
static 4096 505,423 2727.7% 254MiB -19.1% +0.8%
static 6800 460,969 2356.7% 318MiB -24.5% +3.9%
async-db 1024 249,931 4968.6% 230MiB ~0% -7.3%
fortunes 1024 89,610 6398.4% 228MiB +1.2% +1.8%
baseline-h2 256 4,735,569 6052.0% 235MiB -4.7% +4.4%
baseline-h2 1024 3,733,476 6324.9% 539MiB +13.5% +6.7%
static-h2 256 1,042,741 6491.8% 562MiB +0.7% +0.5%
static-h2 1024 819,679 6161.6% 1.6GiB -1.3% -30.4%
baseline-h2c 256 5,818,880 6212.8% 255MiB -3.6% +4.5%
baseline-h2c 1024 4,506,134 6331.3% 516MiB +12.9% -2.3%
baseline-h2c 4096 3,796,119 5956.0% 1.5GiB +1.1% ~0%
json-h2c 1024 1,462,827 6362.0% 303MiB +18.7% -5.0%
json-h2c 4096 1,399,930 6530.9% 833MiB +15.0% +6.7%
baseline-h3 64 1,277 12.7% 175MiB NEW NEW
static-h3 64 1,274 45.5% 275MiB NEW NEW
Full log
request     :      626us      9.82ms      1.71ms     5.14ms     8.46ms     2.24ms      1.56ms    87.47%
connect     :     1.63ms      6.76ms      2.86ms     5.01ms     6.76ms     3.10ms      1.00ms    71.88%
TTFB        :     2.29ms     12.70ms      4.19ms     9.91ms    12.70ms     4.87ms      2.02ms    81.25%
req/s       :      19.98       20.00       19.98      19.99      20.00      19.98        0.00    89.06%
min RTT     :       75us      2.23ms       540us     1.11ms     2.23ms      596us       370us    68.75%
smoothed RTT:      846us      5.64ms      1.40ms     3.49ms     5.64ms     1.67ms       817us    89.06%
packets sent:         28          71          60         69         71      56.66       10.42    75.00%
packets recv:        109         113         110        112        113     110.33        0.96    68.75%
packets lost:          0           0           0          0          0       0.00        0.00   100.00%
GRO packets :          1           2           1          1          2       1.03        0.17    97.15%
[info] CPU 9.2% | Mem 208MiB

=== Best: 1277 req/s (CPU: 12.7%, Mem: 175MiB) ===
[info] saved results/baseline-h3/64/true-async-server.json
httparena-bench-true-async-server
httparena-bench-true-async-server

==============================================
=== true-async-server / static-h3 / 64c (tool=h2load-h3) ===
==============================================
[info] waiting for server...
[info] server ready

[run 1/3]
starting benchmark...
1.
42Main benchmark duration is started for thread #18.
.
TLS Protocol: TLSv1.3
Cipher: TLS_AES_256_GCM_SHA384
Server Temp Key: X25519 253 bits
Certificate: RSA 2048 bits
Negotiated Group: x25519
Resumption: no
Application protocol: h3
63.Main benchmark duration is started for thread #4.

14. Stopping all clients.
. Stopping all clients.
. Stopping all clients.Main benchmark duration is over for thread #25Stopped all clients for thread #. Stopping all clients.32




50. Stopping all clients.
. Stopping all clients.
54. Stopping all clients.

21. Stopping all clients.

finished in 5.02s, 1280.00 req/s, 19.90MB/s
requests: 6400 total, 10496 started, 6400 done, 6400 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 6400 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 99.51MB (104339199) total, 155.69KB (159423) headers (space savings 82.73%), 99.31MB (104129600) data
UDP datagram: 8435 sent, 76876 received
                 min         max         median     p95        p99        mean         sd        +/- sd
request     :     2.64ms     90.96ms     43.84ms    69.08ms    76.11ms    36.02ms     24.74ms    48.39%
connect     :     2.13ms     67.81ms      4.25ms    56.32ms    67.81ms    10.32ms     16.99ms    87.50%
TTFB        :    24.58ms     81.81ms     41.71ms    67.82ms    81.81ms    45.97ms     12.42ms    73.44%
req/s       :      19.98       20.00       19.98      19.99      20.00      19.98        0.00    92.19%
min RTT     :       22us       324us       125us      191us      324us      123us        55us    68.75%
smoothed RTT:      647us     38.52ms      2.64ms     5.34ms    38.52ms     3.77ms      6.28ms    96.88%
packets sent:         72         200         131        180        200     133.80       26.22    68.75%
packets recv:       1199        1214        1203       1209       1214    1203.19        3.21    85.94%
packets lost:          0           0           0          0          0       0.00        0.00   100.00%
GRO packets :          1          45           1         14         37       3.52        6.90    88.88%
[info] CPU 45.5% | Mem 275MiB

[run 2/3]
starting benchmark...
.
TLS Protocol: TLSv1.3
Cipher: TLS_AES_256_GCM_SHA384
Server Temp Key: X25519 253 bits
Certificate: RSA 2048 bits
Negotiated Group: x25519
Resumption: no
Application protocol: h3
16.
.


16. Stopping all clients.
25. Stopping all clients.
. Stopping all clients.Stopped all clients for thread #22

3. Stopping all clients.

finished in 5.02s, 1280.00 req/s, 19.90MB/s
requests: 6400 total, 10496 started, 6400 done, 6400 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 6400 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 99.50MB (104337430) total, 153.96KB (157654) headers (space savings 82.32%), 99.31MB (104129600) data
UDP datagram: 8852 sent, 76818 received
                 min         max         median     p95        p99        mean         sd        +/- sd
request     :      853us     39.63ms      7.32ms    23.46ms    28.41ms    10.12ms      7.00ms    72.83%
connect     :     2.01ms     16.93ms      3.13ms    12.47ms    16.93ms     3.95ms      2.93ms    92.19%
TTFB        :     3.04ms     23.41ms      5.57ms    21.52ms    23.41ms     8.23ms      6.08ms    81.25%
req/s       :      19.98       19.99       19.98      19.98      19.99      19.98        0.00    78.13%
min RTT     :       22us       246us       112us      203us      246us      117us        52us    62.50%
smoothed RTT:      501us      3.42ms       982us     1.55ms     3.42ms     1.08ms       530us    90.63%
packets sent:         96         204         137        181        204     140.31       24.09    68.75%
packets recv:       1198        1210        1202       1207       1210    1202.28        2.53    75.00%
packets lost:          0           0           0          0          0       0.00        0.00   100.00%
GRO packets :          1          45           1         12         34       3.24        6.52    89.94%
[info] CPU 34.0% | Mem 337MiB

[run 3/3]
starting benchmark...
.
.
TLS Protocol: TLSv1.3
Cipher: TLS_AES_256_GCM_SHA384
Server Temp Key: X25519 253 bits
Certificate: RSA 2048 bits
Negotiated Group: x25519
Resumption: no
Application protocol: h3

2. Stopping all clients.

34. Stopping all clients.
. Stopping all clients.Stopped all clients for thread #16

63. Stopping all clients.
8. Stopping all clients.
53Main benchmark duration is over for thread #Main benchmark duration is over for thread #58Stopped all clients for thread #1057
. Stopping all clients.. Stopping all clients.

. Stopping all clients.
39. Stopping all clients.

finished in 5.02s, 1280.00 req/s, 19.90MB/s
requests: 6400 total, 10496 started, 6400 done, 6400 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 6400 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 99.50MB (104336759) total, 153.30KB (156983) headers (space savings 82.15%), 99.31MB (104129600) data
UDP datagram: 8271 sent, 76820 received
                 min         max         median     p95        p99        mean         sd        +/- sd
request     :      768us     36.47ms      7.24ms    18.31ms    23.74ms     8.76ms      5.05ms    72.53%
connect     :     2.00ms      5.69ms      2.88ms     5.14ms     5.69ms     3.09ms       861us    75.00%
TTFB        :     2.93ms     14.88ms      4.81ms     9.51ms    14.88ms     5.52ms      2.32ms    78.13%
req/s       :      19.98       20.00       19.98      19.99      20.00      19.98        0.00    92.19%
min RTT     :       22us       270us       105us      219us      270us      122us        62us    64.06%
smoothed RTT:      415us      1.94ms       777us     1.47ms     1.94ms      828us       287us    82.81%
packets sent:         75         208         133        187        208     131.23       30.21    67.19%
packets recv:       1194        1211        1202       1207       1211    1202.31        3.24    62.50%
packets lost:          0           0           0          0          0       0.00        0.00   100.00%
GRO packets :          1          45           1         12         34       3.20        6.48    90.13%
[info] CPU 23.0% | Mem 361MiB

=== Best: 1274 req/s (CPU: 45.5%, Mem: 275MiB) ===
[info] saved results/static-h3/64/true-async-server.json
httparena-bench-true-async-server
httparena-bench-true-async-server
[info] skip: true-async-server does not subscribe to gateway-64
[info] skip: true-async-server does not subscribe to gateway-h3
[info] skip: true-async-server does not subscribe to production-stack
[info] skip: true-async-server does not subscribe to unary-grpc
[info] skip: true-async-server does not subscribe to unary-grpc-tls
[info] skip: true-async-server does not subscribe to stream-grpc
[info] skip: true-async-server does not subscribe to stream-grpc-tls
[info] skip: true-async-server does not subscribe to echo-ws
[info] skip: true-async-server does not subscribe to echo-ws-pipeline
[info] rebuilding site/data/*.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/frameworks.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/api-16-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/api-4-256.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/async-db-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-h2-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-h2-256.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-h2c-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-h2c-256.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-h2c-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-h3-64.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/fortunes-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-comp-16384.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-comp-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-comp-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-h2c-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-h2c-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-tls-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/limited-conn-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/limited-conn-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/pipelined-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/pipelined-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-6800.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-h2-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-h2-256.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-h3-64.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/upload-256.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/upload-32.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/current.json
[info] done
httparena-postgres
[info] restoring loopback MTU to 65536
[info] restoring CPU governor → powersave

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant